프로토타입 상속

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.02
조회수
9
버전
v1

프로토타입 상속

프로토타입 상속(Prototype Inheritance)은 자바스크립트(JavaScript)에서 객체 간에 속성과 메서드를 상속받는 핵심 메커니즘입니다. 전통적인 클래스 기반 객체지향 언어(예: Java, C++)와 달리, 자바스크립트는 프로토타입 기반 객체지향 프로그래밍(Prototype-based OOP)을 채택하고 있으며, 이 방식에서 프로토타입 상속은 객체가 다른 객체의 기능을 재사용할 수 있게 해주는 핵심 개념입니다.

이 문서에서는 프로토타입 상속의 개념, 작동 원리, 구현 방식, 그리고 객체지향 프로그래밍 관점에서의 중요성을 다룹니다.


개요

자바스크립트는 클래스 기반이 아닌 프로토타입 기반 언어입니다. 즉, 객체 클래스를 통해 생성되는 것이 아니라, 기존 객체를 복제하거나 참조하여 새로운 객체를 만들 수 있습니다. 이 과정에서 한 객체가 다른 객체의 프로퍼티와 메서드를 상속받는 방식을 프로토타입 상속이라 부릅니다.

모든 자바스크립트 객체는 숨겨진 내부 프로퍼티 [[Prototype]]을 가지며, 이는 다른 객체를 가리키거나 null일 수 있습니다. 이 [[Prototype]] 체인을 통해 객체는 자신의 직접적인 프로퍼티 외에도 상위 객체(프로토타입)의 프로퍼티와 메서드에 접근할 수 있습니다.


프로토타입 상속의 작동 원리

1. [[Prototype]]__proto__

모든 객체는 내부 슬롯 [[Prototype]]을 가지며, 이는 객체의 상속 체인을 구성합니다. 개발자는 이를 __proto__ 속성(비표준이지만 대부분의 환경에서 지원)이나 Object.getPrototypeOf()를 통해 접근할 수 있습니다.

const parent = { name: "Parent", greet() { console.log("Hello!"); } };
const child = Object.create(parent);

console.log(child.name); // "Parent" (상속됨)
child.greet(); // "Hello!" (상속된 메서드 호출)

위 예제에서 child 객체는 parent를 프로토타입으로 가지며, child에 정의되지 않은 namegreetparent에서 찾아 사용합니다.

2. 프로토타입 체인 (Prototype Chain)

객체가 프로퍼티를 찾을 때, 먼저 자기 자신에 존재하는지 확인하고, 없으면 [[Prototype]]을 따라 상위 객체로 탐색합니다. 이 과정은 체인처럼 계속되어 최종적으로 Object.prototype에 도달하고, 더 이상의 상속이 없을 때까지 진행됩니다. 이를 프로토타입 체인이라고 합니다.

child.toString(); // Object.prototype의 toString() 호출

child 객체는 toString 메서드를 직접 정의하지 않았지만, Object.prototype에 정의된 메서드를 체인을 통해 호출할 수 있습니다.


프로토타입 상속 구현 방식

1. Object.create()

가장 명시적이고 순수한 프로토타입 상속 방식입니다. 주어진 객체를 프로토타입으로 삼아 새로운 객체를 생성합니다.

const animal = { eats: true };
const rabbit = Object.create(animal);
rabbit.jumps = true;

console.log(rabbit.eats); // true (animal에서 상속됨)

2. 생성자 함수와 prototype 속성

함수는 prototype 속성을 가지며, 이는 해당 함수로 생성된 인스턴스들의 프로토타입이 됩니다.

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(`${this.name} makes a noise.`);
};

const dog = new Animal("Dog");
dog.speak(); // "Dog makes a noise."

여기서 dog 객체는 Animal.prototype을 프로토타입으로 가지며, speak 메서드를 상속받습니다.

3. ES6 클래스 문법 (Syntactic Sugar)

ES6에서는 class 키워드를 도입하여 더 직관적인 문법을 제공하지만, 내부적으로는 여전히 프로토타입 기반입니다.

class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks.`);
  }
}

const dog = new Dog("Buddy");
dog.speak(); // "Buddy barks."

extends 키워드는 실제로 프로토타입 체인을 설정합니다. Dog.prototypeAnimal.prototype을 상속받고, Dog 생성자 함수는 Animal을 상속합니다.


프로토타입 상속의 장점과 단점

장점 설명
유연성 객체를 동적으로 확장하거나 수정할 수 있음
메모리 효율 공통 메서드를 프로토타입에 정의하면 모든 인스턴스가 공유
동적 상속 런타임에 프로토타입 체인을 변경 가능 (단, 성능에 영향)
단점 설명
복잡성 프로토타입 체인이 길어지면 디버깅이 어려움
성능 저하 프로퍼티 탐색이 체인을 따라 진행되므로 깊이가 깊을수록 느려짐
비직관성 클래스 기반 언어에 익숙한 개발자에게는 이해가 어려울 수 있음

객체지향 프로그래밍(OOP) 관점에서의 의미

프로토타입 상속은 자바스크립트가 객체지향 프로그래밍 패러다임을 지원하는 핵심 수단입니다. 전통적인 클래스 상속이 아닌, 객체 상속을 통해 다음과 같은 OOP 원칙을 구현합니다:

  • 상속(Inheritance): 객체가 다른 객체의 기능을 재사용
  • 다형성(Polymorphism): 동일한 메서드 이름이 다른 객체에서 다르게 동작
  • 캡슐화(Encapsulation): 클로저와 스코프를 활용해 상태를 보호

이러한 특성 덕분에 자바스크립트는 클래스 기반 언어와는 다른 방식으로 객체지향 설계를 가능하게 합니다.


참고 자료 및 관련 문서


요약: 프로토타입 상속은 자바스크립트의 핵심 객체 모델로, 객체 간의 상속을 프로토타입 체인을 통해 구현합니다. 클래스 기반 언어와는 다르지만, 유연하고 강력한 객체지향 프로그래밍을 가능하게 하며, ES6의 class 문법도 이 기반 위에 구축되어 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?